package com.colabo.j2ee.web.oaf.orgnization;

import java.util.HashMap;
import java.util.List;

import com.colabo.j2ee.web.core.exception.CommonException;
import com.colabo.j2ee.web.core.exception.ServiceException;
import com.colabo.j2ee.web.oaf.orgnization.model.SCUnitProfileVO;

public interface IUnitService {
	public static final String BEAN_ID = "unitService";

	public SCUnitProfileVO getUnitByUnitId(String unitid) throws ServiceException;

	/**
	 * 取机构下直属机构和部门, 一般用于构造组织树, 返回结果仅显示未删除记录
	 * 
	 * @param unit
	 * @return List<SCUnitProfileVO>
	 * @throws ServiceException
	 */
	public List getUnitsBySuperUnit(SCUnitProfileVO unit) throws ServiceException;

	public List getUnitsBySuperUnit(SCUnitProfileVO unit, int offset, int pageSize) throws ServiceException;

	public int getUnitCountBySuperUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 取机构下直属机构和部门, 根据delFlag进行过滤.
	 * 
	 * @param unit
	 * @param isDeleted
	 *            若为null则此条件不起作用, 显示已删除和未删除的所有机构, 若为true则返回已删除的, 为false则返回未删除的
	 * @param offset
	 * @param pageSize
	 * @return List<SCUnitProfileVO>
	 * @throws ServiceException
	 */
	public List getUnitsBySuperUnit(SCUnitProfileVO unit, Boolean isDeleted, int offset, int pageSize) throws ServiceException;

	public int getUnitCountBySuperUnit(SCUnitProfileVO unit, Boolean delFlag) throws ServiceException;

	/**
	 * 取机构下所属部门, 用于编辑组织数据时得到组织列表, 若数据库中机构的ownerUnit指向自身则调用此对象得到自己和下属部门数据
	 * 
	 * @param ownerUnit
	 * @param offset
	 * @param size
	 * @return List<SCUnitProfileVO>
	 * @throws ServiceException
	 */
	public List getUnitsByOwnerUnit(SCUnitProfileVO unit, int offset, int size) throws ServiceException;

	public int getUnitCountByOwnerUnit(SCUnitProfileVO unit) throws ServiceException;

	public List getUnitsByOwnerUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 根据OwnerUnit显示部门
	 * 
	 * @param ownerUnit
	 * @param delFlag
	 *            是否显示删除的部门, 为null显示所有部门, 为true显示删除的部门, 为false显示未删除部门
	 * @param offset
	 * @param size
	 * @return List<SCUnitProfileVO>
	 * @throws ServiceException
	 */
	public List getUnitsByOwnerUnit(SCUnitProfileVO unit, Boolean delFlag, int offset, int size) throws ServiceException;

	public int getUnitCountByOwnerUnit(SCUnitProfileVO unit, Boolean delFlag) throws ServiceException;

	/**
	 * 保存新建的组织
	 * 
	 * @param unitVo
	 * @return List<SCUnitProfileVO>, 返回值为保存后的对象, 写入了delFlag等属性默认值
	 * @throws ServiceException
	 */
	public String save(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 批量保存组织
	 * 
	 * @param units
	 * @return
	 * @throws ServiceException
	 */
	public List save(List units) throws ServiceException;

	public SCUnitProfileVO update(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 批量保存组织数据
	 * 
	 * @param insertBeans
	 * @param updateBeans
	 * @param delBeansStr
	 * @throws ServiceException
	 */
	public void batchCommit(List insertBeans, List updateBeans, String delBeansStr) throws ServiceException;

	public int delete(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 恢复已删除的机构
	 * 
	 * @param unit
	 * @return
	 * @throws ServiceException
	 */
	public int undelete(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 查找superUnit的ownerUnit. 若superUnit设置了ownerUnit, 直接返回ownerUnit
	 * 否则递归向上查找直到kind="ORG" 若找到最上级节点仍无法找到kind="ORG"的组织, 则返回null
	 * 
	 * @param superUnit
	 * @return
	 * @throws ServiceException
	 */
	public SCUnitProfileVO getOwnerUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 取得所有bizType数据
	 * 
	 * @return List<IPBizTypeVO>
	 * @throws ServiceException
	 */
	List getAllBizTypes() throws ServiceException;

	/**
	 * 查找当前单位的相关信息
	 * @param unit      当前单位
	 * @param direction 方向（所有上级节点、上级跟节点、上级非根节点、
	 * 						兄弟节点、自己节点、
	 * 						下级所有节点、下级所有叶子节点、下级所有内部节点）
	 * @param offset    步长
	 * @return 组织列表，List中的对象是单位编码
	 * @throws ServiceException
	 */
	public List findUnit(String unit,String direction,String offset) throws ServiceException;
	
	
	public List getAllUnitByPosition(String uintId) throws ServiceException ;
	/**
	 * 根据应用判断是否存在单位
	 * @param unitcode
	 * @return
	 */
	public boolean isExist(String unitcode) throws ServiceException;
	
	/**
	 * 级联删除,逻辑删除
	 * @param unit
	 * @return
	 * @throws ServiceException
	 */ 
	public boolean delChildren(SCUnitProfileVO unit) throws ServiceException;
	
	/**
	 * 获得最大排序号
	 * @return
	 * @throws ServiceException
	 */
	public long getMaxIndexNo() throws ServiceException;
	/**
	 * 获取全部组织机构列表
	 * @return 组织机构列表
	 * @throws ServiceException
	 */
	public List getAllUnits() throws ServiceException;
	/**
	 * 按组织编码或组织名称查询出相关的组织机构列表
	 * @param map 用于存放查询条件
	 * @return 查询结果机构列表
	 * @throws ServiceException
	 */
	public List queryUnit(HashMap map) throws ServiceException;
	
	public List getAllChildUnitByUnitId(String unitId) throws ServiceException;
	
	/**
	 * 按组织编码或组织名称查询出相关的已删除组织机构列表
	 * @param map 用于存放查询条件
	 * @param offset 
	 * @param pageSize
	 * @return 查询结果机构列表
	 * @throws ServiceException
	 */
	public List queryBackUnit(HashMap map, int offset, int pageSize) throws ServiceException;
	
	/**
	 * 按组织编码或组织名称查询出相关的已删除组织机构数量
	 * @param map 用于存放查询条件
	 * @return 查询结果机构列表
	 * @throws ServiceException
	 */
	public int queryBackUnitCount(HashMap map) throws ServiceException;
	
	/**
	 * 批量还原组织机构
	 * @param backBeans 待还原的组织机构列表
	 * @return
	 * @throws ServiceException
	 * @throws CommonException
	 */
	public String saveBackToUnit(List backBeans) throws ServiceException ,CommonException;
	
	/**
	 * 批量删除组织机构，这里的删除是物理删除，删除后，数据库中不再存在数据
	 * @param delBeans 待删除的组织机构列表
	 * @return
	 * @throws ServiceException
	 * @throws CommonException
	 */
	public String saveFullDel(List delBeans) throws ServiceException ,CommonException;
	
	/**
	 * 按组织编码或组织名称查询出相关的组织机构列表
	 * @param map 用于存放查询条件 
	 * @param offset 
	 * @param pageSize
	 * @return 查询结果机构列表
	 * @throws ServiceException
	 */
	public List queryUnit(HashMap map, int offset, int pageSize) throws ServiceException;
	
	/**
	 * 按组织编码或组织名称查询出相关的已删除组织机构数量
	 * @param map 用于存放查询条件
	 * @return 查询结果机构列表
	 * @throws ServiceException
	 */
	public int queryUnitCount(HashMap map) throws ServiceException;
	
	/**
	 * 修改子节点treePath
	 * @param oldPath
	 * @param newPath
	 */
	public void updateChildTreePath(String oldPath, String newPath);
}
